package com.qfmy.web.consts;

import com.qfmy.web.enmu.ResultCode;
import lombok.Data;

import org.jetbrains.annotations.NotNull;



/**
 * @Author: 廖志伟
 * @Description: 返回结果类
 */
@Data
@SuppressWarnings("all")
public class Result<T> {
    //返回码
    private Integer code;
    //返回消息
    private String message;
    //返回数据
    private T data;
    // 时间戳->表示哪一次调的接口
    private Long timestamp;

    public Result()
    {
        //创建接口调用时间
        this.timestamp = System.currentTimeMillis();
    }

    /**
     * 构建一个包含数据的Result对象
     * @param <T> 数据的类型
     * @param data 要包含的数据，不能为空
     * @return 包含数据的Result对象
     */
    @NotNull
    private static <T> Result<T> build(T data) {
        // 创建一个新的Result对象
        Result<T> result = new Result<>();
        // 判断数据是否为空
        if (data != null) {
            // 如果数据不为空，则将数据设置到Result对象中
            result.setData(data);
        }
        // 返回Result对象
        return result;
    }

    /**
     * 成功响应 -> 返回指定数据 和状态码
     */
    public static <T> @NotNull Result<T> success(Integer code, T data) {
        // 创建一个新的Result对象
        Result<T> result = build(data);
        // 设置返回码
        result.setCode(code);
        // 设置返回消息
        return result;
    }
    /**
     *成功响应 -> 返回状态码
     */
    public static <T> @NotNull Result<T> success(Integer code) {
        // 创建一个新的Result对象
        Result<T> build = build(null);
        // 设置返回码
        build.setCode(code);
        // 设置返回消息
        return build;
    }

    /**
     * 成功响应 -> 返回指定数据
     */
    public static <T> @NotNull Result<ResultCode> success(ResultCode resultCode) {
        // 创建一个新的Result对象
        Result<ResultCode> build = build(resultCode);
        //返回
        return build;
    }

    /**
     * 失败响应 -> 返回指定数据 和状态码
     */
    public static <T> @NotNull Result<T> fail(T data, Integer code) {
        // 创建一个新的Result对象
        Result<T> result = build(data);
        // 设置返回码
        result.setCode(code);
        // 设置返回消息
        return result;
    }
    /**
     * 失败响应 -> 返回状态码
     */
    public static <T> @NotNull Result<T> fail(Integer code) {
        // 创建一个新的Result对象
        Result<T> build = build(null);
        // 设置返回码
        build.setCode(code);
        // 设置返回消息
        return build;
    }

    /**
     * 失败响应 -> 返回指定数据
     */
    public static <T> @NotNull Result<T> fail(T data) {
        // 创建一个新的Result对象
        Result<T> build = build(data);
        //返回
        return build;
    }

    /**
     * 失败响应 -> 返回指定数据
     */
    public static <T> @NotNull Result<ResultCode> fail(ResultCode resultCode) {
        // 创建一个新的Result对象
        Result<ResultCode> build = build(resultCode);
        //返回
        return build;
    }




}
